package com.fjsh.mq.provider;

import java.util.UUID;

import com.fjsh.consts.ExchangeConst;
import com.fjsh.consts.RoutingKeyConst;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
 
/**
 * RabbitSend
 */
@Component
public class MqProvider {
 
    @Autowired
    @Qualifier(value = "testRabbitTemplate")
    private RabbitTemplate rabbitTemplate;
 
    /**
     * 发送死信队列
     */
    public void sendDeadMsg(String msg) {
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        // 声明消息处理器 这个对消息进行处理 可以设置一些参数 对消息进行一些定制化处理 我们这里 来设置消息的编码 以及消息的过期时间
        // 因为在.net 以及其他版本过期时间不一致 这里的时间毫秒值 为字符串
        MessagePostProcessor messagePostProcessor = message -> {
            MessageProperties messageProperties = message.getMessageProperties();
            // 设置编码
            messageProperties.setContentEncoding("utf-8");
            // 设置过期时间10*1000毫秒
            messageProperties.setExpiration("1000");
            return message;
        };
        // 向test_queue 发送消息 10*1000毫秒后过期 形成死信,具体的时间可以根据自己的业务指定
        rabbitTemplate.convertAndSend(ExchangeConst.TEST_DEAD_EXCHANGE, RoutingKeyConst.TEST_DIRECT_ROUTINGKEY, msg, messagePostProcessor, correlationData);
    }
 
    /**
     * 发送一条Fanout扇形队列
     */
    public void sendTestFanoutMsg(String msg) {
        rabbitTemplate.convertAndSend(ExchangeConst.TEST_FANOUT_EXCHANGE, "", msg, new CorrelationData(UUID.randomUUID().toString()));
    }
 
    /**
     * 发送一条Direct直连队列 若有开启回调机制，必须传此参数new CorrelationData("1")，用于声明ID
     */
    public void sendTestDirectMsg(String msg) {
        rabbitTemplate.convertAndSend(ExchangeConst.TEST_DIRECT_EXCHANGE, RoutingKeyConst.TEST_DIRECT_ROUTINGKEY, msg, new CorrelationData(UUID.randomUUID().toString()));
    }
 
    /**
     * 发送一条Topic消息队列
     */
    public void sendTestMsg(String msg) {
        rabbitTemplate.convertAndSend(ExchangeConst.TEST_TOPIC_EXCHANGE, "test.mq", msg);
    }
}